﻿/**
 *		智能指针类
 *@author		吴建凰
 *@date			2016年11月30日
 *@reference	http://blog.csdn.net/lmsnju/article/details/4734840
 */
#ifndef MFH_SMARTPTR_H
#define MFH_SMARTPTR_H
#include "ossType.h"

#ifdef __cplusplus//不是C++,则不给支持

/**
 *      智能指针类
 */
template <typename T>
class OssSmartPtr
{
public:
	OssSmartPtr(T *p=NULL)
		: ptr(p)
		, pUse(new int(1)){}
	OssSmartPtr(const OssSmartPtr& src): ptr(src.ptr)
		, pUse(src.pUse) 
	{
		++*pUse;
	}

	virtual ~OssSmartPtr(){decrUse();}
	
	//重载运算符
	OssSmartPtr& operator= (const OssSmartPtr& rhs) 
	{
		// self-assigning is also right
		++*rhs.pUse;
		decrUse();
		ptr = rhs.ptr;
		pUse = rhs.pUse;
		return *this;
	}

	T *			 operator->()
	{
		return ptr;			
	}

	const T *	 operator->() const
	{
		return ptr;
	}

	T&			 operator*()
	{
		return *ptr;
	}

	const T&	 operator*() const
	{
		return *ptr;
	}
	
	//获取引用次数
	int GetReferenceCount()
	{
		return *pUse;
	}
private:
	//减少使用次数
	void decrUse() 
	{
		if (--*pUse == 0) {
            if (ptr)
            {
                delete ptr;
            }
			
			delete pUse;
		}
	}
	T				*ptr;
	volatile int	*pUse;
};

#endif //#ifdef __cplusplus
#endif

